Amazon Connectを使ったCloudWatchアラームの電話通知で指定した担当者への通知を番号入力で判定してみた
こんにちは。
繁松です。
はじめに
前回のブログでAmazon Connectを使ったCloudWatchアラームの電話通知で次の担当者への通知を番号入力で判定してみたについて紹介しました。
前回は順番にリストの次の電話番号に通知を行う設定でしたが、今回は電話通知を指定した担当者へ通知する構成を考えてみました。
アラート発報後の架電時に「Aさん通知する場合は1を、Bさんに通知する場合は2を、Cさんに通知する場合は3を入力してください。」と案内し、入力された番号でどの担当者に電話通知を行うか指定します。
1~3以外の番号が押された場合には次の担当者への通知は行わずに終了する内容になっています。
やってみた
前提条件
- Amazon Connect
- 構築済みであること
- 電話番号を取得済みであること
Amazon Connect
Amazon Connectコンタクトフローの作成
以下のようなフローを作成します。
①入力を取得するブロック
CloudWatchアラーム名とAさんに通知する場合は1を、Bさんに通知する場合は2を、Cさんに通知する場合は3を入力してくださいという案内を設定します。
オプションに1、2、3を設定し、番号が入力された場合の分岐を設定します。
クラウドウォッチアラームの通知です。 $.Attributes.alarmName のアラームが発生しています。
Aさんに通知する場合は1を
Bさんに通知する場合は2を
Cさんに通知する場合は3を
通知を終了する場合は9を入力してください。
②コンタクト属性の設定ブロック
顧客の入力した値は保存することができないので、コンタクト属性の設定ブロックで入力値を保存して、保存した値をLambda関数のパラメータに渡します。
以下の値を入力し保存します。
名前空間:ユーザー定義済み
キー:CustomerInput
値:顧客の入力と合わせた数値(1の入力では1を設定する)
③AWS Lambda関数を呼び出すブロック
この時点ではLambdaの作成が完了していないので、関数のARNは空のまま保存してください。
関数入力パラメータは、次の担当者に通知する際に必要となるalarmNameとcurrentIndexを設定します。
currentIndexにはコンタクト属性の設定ブロックで設定した値を設定します。
Lambda
Lambda関数の作成
Python 3.12でLambdaを作成します。
ロールのポリシー追加
LambdaのロールにAmazon Connectの発信に必要な以下のポリシーを追加します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "connect:StartOutboundVoiceContact",
"Resource": "*"
}
]
}
CloudWatchアラーム用のポリシー追加
LambdaにCloudWatchのリソースベースポリシーを追加します。
Lambda→アクセス権限→リソースベースのポリシーステートメントで「アクセス権限を追加」を選択します。
以下の値を入力し保存します。
ステートメントID:任意の値
プリンシパル:lambda.alarms.cloudwatch.amazonaws.com
アクション:lambda:InvokeFunction
コード
Amazon ConnectのインスタンスID、コンタクトフローID、Amazon Connectで取得した電話番号、通知先の電話番号を設定します。
通知先の電話番号は入力した数値とリストのインデックスが一致するように、インデックス0は空にしています。
電話番号は「E.164」形式(例:+815011111111)を設定する必要があります。
今回「EC2_CPU使用率80%超過」というアラート名を読み上げて通知したいのですが、EC2を「イーシー二」と呼んでしまうのでコードの中で「イーシーツー」に変換しています。
import boto3
def lambda_handler(event, context):
connect = boto3.client('connect')
instance_id = 'Amazon ConnectインスタンスID'
contact_flow_id = 'コンタクトフローID'
source_phone_number = 'Amazon Connectで取得した電話番号'
# 担当者リスト
phone_numbers = ['', 'Aさんの電話番号', 'Bさんの電話番号', 'Cさんの電話番号']
# イベントから現在の担当者のインデックスを取得、初回は1
current_index = int(event.get('Details', {}).get('Parameters', {}).get('currentIndex', 1))
# アラーム名を取得
if 'alarmData' in event:
alarmName = event['alarmData']['alarmName']
alarmName_replace = alarmName.replace("EC2", "イーシーツー")
else:
alarmName_replace = event['Details']['Parameters'].get('alarmName', '')
# 担当者に電話をかける
destination_phone_number = phone_numbers[current_index]
response = connect.start_outbound_voice_contact(
DestinationPhoneNumber=destination_phone_number,
ContactFlowId=contact_flow_id,
InstanceId=instance_id,
SourcePhoneNumber=source_phone_number,
Attributes={
'alarmName': alarmName_replace,
}
)
通知先の電話番号を携帯電話宛(070,080,090)に設定したい場合はAWSサポートへの申請が必要になります。
Amazon Connect
Lambda関数の追加
作成したLambda関数をAmazon Connectに追加します。
AWSコンソール→Amazon Connect(対象のインスタンス)→問い合わせフローを開きます。
AWS Lambdaの項目で作成したLambda関数を選択し「+Add Lambda Function」を選択します。
コンタクトフローのLambdaブロックに設定
先ほどの手順で関数のARNを空で保存した「AWS Lambda関数を呼び出す」ブロックを開き、追加したLambda関数を設定します。
CloudWatch
CloudWatch Alarmの作成
EC2のCPU使用率が80%を超えた場合のアクションに電話通知用のLambdaを設定してみます。
Lambdaアクションに先ほど作成した関数を設定します。
アラーム名に「EC2_CPU使用率80%超過」を設定します。
動作確認
動作確認のためAmazon Connect宛の番号をLambdaに設定し電話通知を行いました。
さいごに
Amazon ConnectとLambdaを使用して、通知を行いたい担当者を指定する方法を紹介しました。
これまでに紹介した通知以外にもフローとLambdaを組み合わせることで、より便利な使い方ができると考えられます。
参考情報